from typing import List

from llama_index.core.agent.workflow import  FunctionAgent
from llama_index.core.vector_stores import SimpleVectorStore
from llama_index.core.schema import  TextNode
from llama_index.core import Settings, SimpleKeywordTableIndex, SummaryIndex, get_response_synthesizer, \
    VectorStoreIndex, ListIndex
from llama_index.embeddings.zhipuai import ZhipuAIEmbedding
from llama_index.core.graph_stores import SimplePropertyGraphStore
from llama_index.core.schema import Document
from pydantic import BaseModel

embed_model = ZhipuAIEmbedding(
    model="embedding-2",
    api_key="f387f5e4837d4e4bba6d267682a957c9.PmPiTw8qVlsI2Oi5"
    # With the `embedding-3` class
    # of models, you can specify the size
    # of the embeddings you want returned.
    # dimensions=1024
)
Settings.embed_model=embed_model

from llama_index.llms.deepseek import DeepSeek

llm = DeepSeek(model="deepseek-chat", api_key="sk-605e60a1301040759a821b6b677556fb")
Settings.llm = llm
from llama_index.core.extractors.metadata_extractors import (
    KeywordExtractor,
    PydanticProgramExtractor,
    QuestionsAnsweredExtractor,
    SummaryExtractor,
    TitleExtractor,
)
from llama_index.core.extractors.document_context import DocumentContextExtractor


text="""2022年6月14日，江苏南京大报恩塔与“超级月亮”相映成景。新华社发（苏阳 摄）　
　今年农历八月的这次满月，也算是一次“超级月亮”。月球的公转轨道是椭圆形的，地月平均距离约是38万千米，离得最远的时候能达到40万千米，近的时候只有35万多千米。如果月球位于近地点前后又恰逢满月，就是所谓的“超级月亮”。
这次的中秋节和之后的农历八月十六晚上，月球距离我们大约是36万千米。虽然并非全年最大满月，但也算是“排进前三”的“超级月亮”了。"""
node=TextNode(text=text)


keywordExtractor=KeywordExtractor()
rs=keywordExtractor.extract([node])
print(rs)

documents_part1=[Document(text="江苏的省会是南京")]

documents_part2=[Document(text='''南京，简称"宁"，别称"金陵""建康"，是江苏省省会、长三角核心城市，拥有3100年建城史和450年建都史，与北京、西安、洛阳并称中国四大古都‌
1。作为特大城市，其面积6587平方公里（相当于8个纽约曼哈顿），人口近千万，综合实力稳居全国前十‌
''')]


# 初始化各子索引
vector_index = VectorStoreIndex.from_documents(documents_part1)
keyword_index = ListIndex.from_documents(documents_part2)

print((keyword_index))

'''

questionsAnsweredExtractor=QuestionsAnsweredExtractor(prompt_template="""上下文信息：
{context_str}

根据上述背景信息，
生成{num_questions}个该上下文能提供具体答案的问题，
这些问题答案在其它地方不太可能找到。

可以提供周边上下文的高级摘要，
尝试利用这些摘要生成更高质量的问题，
确保这些问题能够被当前上下文解答。""")
rs=questionsAnsweredExtractor.extract([node])
print(rs)


summaryExtractor=SummaryExtractor(prompt_template="""本节内容如下：
{context_str}

请总结本节的核心主题和关键实体。

摘要：""")
rs=summaryExtractor.extract([node])
print(rs)

titleExtractor=TitleExtractor()
rs=titleExtractor.extract([node])
print(rs)



from pydantic import BaseModel, Field


from llama_index.program.openai import OpenAIPydanticProgram

class Person(BaseModel):
    ''''''
    name: str = Field(description="名称")
    age: int    = Field(description="年龄")
    location: str=Field(description="位置")

program = OpenAIPydanticProgram.from_defaults(
    llm=llm,
    output_cls=Person,
    prompt_template_str="Extract person details: {input}"
)
result = program(input="John is 25 years old and lives in New York")
print(result)
'''